package Elementos;

public class Doble implements EnRango{
	private Double valor;
	private boolean enRango=false;
	private final Double min= 2.2250738585072014 * Math.pow(10,-308);
	private final Double max= 1.7976931348623157 * Math.pow(10, 308);
	
	
	public Doble(String d, String tipo) {
		if ( tipo.equals("double")){
			try{
				this.valor= this.parseDouble(d);
				this.enRango= this.chekearRango();
			}catch (NumberFormatException e) {                               //en caso de que parte entera, decimal o potencia superen el maximo permitido por el lenguaje
				this.enRango= false; }
			}
		else{
			try{
				Integer a= Integer.parseInt(d);
				this.valor= new Double(a);
				this.enRango= this.chekearRango();
			}catch (NumberFormatException e) {                               //en caso de que parte entera, decimal o potencia superen el maximo permitido por el lenguaje
				this.enRango= false; }
		}				
	}
	
	
	public boolean chekearRango(){
		boolean result= false;
		Double p= Math.abs(this.valor);
		if (p.equals(0.0))
			return true;
		else
			if (((p>=this.min) && (p<=this.max)))
				result=true;		
		return result;
	}
	
	public boolean estaEnRango (){
		return this.enRango;
	}
	
	//Parsea el string y arma el double
	public Double parseDouble(String actual){
		int posPunto= actual.indexOf(".");
		
		int posD=-1;
		posD= actual.indexOf("D");
		if(posD==-1)
			posD= actual.indexOf("d");
		
		int posSigno=-1;
		boolean positivo=true;		
		posSigno= actual.indexOf("+");
		if (posSigno==-1){
			posSigno= actual.indexOf("-");
			if(posSigno!=-1)
				positivo=false;
		}
		
		int parteEntera=0;
		int parteDecimal=0;
		int potencia=0;
		if(posPunto!=-1){
			if (posPunto!=0)
				parteEntera= Integer.parseInt(actual.substring(0, posPunto));
			if (posD!=-1){
				if (posPunto!= (posD-1)){
					parteDecimal= Integer.parseInt(actual.substring(posPunto+1, posD));
					potencia= actual.substring(posPunto+1, posD).length()* (-1);
				}
			}
			else{
				if (posPunto!=actual.length()-1){
					parteDecimal= Integer.parseInt(actual.substring(posPunto+1, actual.length()));
					potencia= actual.substring(posPunto+1, actual.length()).length() * (-1);
				}
			}
		}
			
		int exponente=0;
		if (posD!=-1){																				//si no hay d no hay numero
			if (posSigno!= -1)
				exponente= Integer.parseInt(actual.substring(posSigno+1, actual.length()));			//apartir de signo
			else
				exponente= Integer.parseInt(actual.substring(posD+1, actual.length()));				//a partir de la d
		}
		if (!positivo)																				//pone el signo al exponente
			exponente= exponente*-1;
		
		Double total= (parteEntera + parteDecimal * Math.pow(10, potencia)) * Math.pow(10, exponente);
		return total;
	}
	
	public void setValor(Double v){
		this.valor=v;
	}
	
	public Double getValor(){
		return this.valor;
	}
	
	@Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Doble other = (Doble) obj;
        if (!this.getValor().equals(other.getValor())) {
            return false;
        }
        return true;
    }
	
	@Override
    public String toString(){
        return this.valor.toString();
    }
	
	public static void main(String[] args) {
	 	Doble h= new Doble("12222222222222222222222222222222222222", "constante");
	   	System.out.println(h.toString());
	   	System.out.println(h.estaEnRango());
	}
}
